package org.common;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.InputStreamReader;

@Slf4j
public abstract class BaseMain {

    public boolean shutdownFlag = false;

    protected void init() {
        initServer();
        initListenConsoleInput();
    }

    /**
     * 初始化控制台输入监听
     */
    private void initListenConsoleInput() {
        //region 处理控制台输入，每秒检查一遍 shutdownFlag，为true就跳出循环，执行关闭操作
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            if (this.shutdownFlag) {
                log.info("收到kill-15信号,跳出while循环，准备停服");
                break;
            }

            //线程休眠一秒
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //处理控制台指令
            try {
                if (br.ready()) {
                    String str = br.readLine().trim();
                    log.info("后台指令: {}", str);
                    if ("stop".equals(str)) {
                        this.shutdownFlag = true;
                    } else {
                        handleBackGroundCmd(str);//子类实现
                    }

                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("执行命令失败:遇到致命错误");
            }

        }
        //endregion

        //region 关闭服务器前执行的逻辑,加上try-catch防止异常导致无法关服
        try {
            onShutdown();
        } catch (Exception e) {
            log.error("执行关闭服务器逻辑出现异常了！！！！", e);
        }
        //endregion
    }

    /**
     * 虚方法：处理控制台传过来的指令
     *
     * @param cmd 指令
     */
    protected abstract void handleBackGroundCmd(String cmd);

    protected void onShutdown(){

    }

    /**
     * 服务初始化
     */
    protected abstract void initServer();
}
